# mypy: ignore-errors
from pytest_pyodide.decorator import run_in_pyodide


@run_in_pyodide(packages=["protobuf"])
def test_protobuf(selenium):
    from google.protobuf.descriptor_pb2 import FieldDescriptorProto
    from google.protobuf.internal import api_implementation
    from google.protobuf.proto_builder import MakeSimpleProtoClass

    _message = api_implementation._c_module
    assert _message is not None  # check presence of binary component

    SampleObject = MakeSimpleProtoClass(
        {
            "field1": FieldDescriptorProto.TYPE_INT64,
            "field2": FieldDescriptorProto.TYPE_INT64,
        }
    )

    sample = SampleObject()
    sample.field1 = 1
    sample.field2 = 2

    assert repr(sample) == "field1: 1\nfield2: 2\n"


@run_in_pyodide(packages=["protobuf"])
def test_generated_protobuf_code(selenium):
    """
    This tests whether the package works with a generated _pb2.py file.
    It uses the addressbook.proto from here:
    https://github.com/protocolbuffers/protobuf/blob/main/examples/addressbook.proto
    After generation some small modifications have been made to fit the tests.
    It doesn't create any new globals for example.
    """
    from copy import copy, deepcopy

    from google.protobuf import descriptor_pool as _descriptor_pool
    from google.protobuf import symbol_database as _symbol_database
    from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
    from google.protobuf.internal import builder as _builder

    _sym_db = _symbol_database.Default()

    assert google_dot_protobuf_dot_timestamp__pb2  # silence flake8 by "using it"

    DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(
        b'\n\x11\x61\x64\x64ressbook.proto\x12\x08tutorial\x1a\x1fgoogle/protobuf/timestamp.proto"\x87\x02\n\x06Person\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\x05\x12\r\n\x05\x65mail\x18\x03 \x01(\t\x12,\n\x06phones\x18\x04 \x03(\x0b\x32\x1c.tutorial.Person.PhoneNumber\x12\x30\n\x0clast_updated\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1aG\n\x0bPhoneNumber\x12\x0e\n\x06number\x18\x01 \x01(\t\x12(\n\x04type\x18\x02 \x01(\x0e\x32\x1a.tutorial.Person.PhoneType"+\n\tPhoneType\x12\n\n\x06MOBILE\x10\x00\x12\x08\n\x04HOME\x10\x01\x12\x08\n\x04WORK\x10\x02"/\n\x0b\x41\x64\x64ressBook\x12 \n\x06people\x18\x01 \x03(\x0b\x32\x10.tutorial.PersonB\x95\x01\n\x1b\x63om.example.tutorial.protosB\x11\x41\x64\x64ressBookProtosP\x01Z:github.com/protocolbuffers/protobuf/examples/go/tutorialpb\xaa\x02$Google.Protobuf.Examples.AddressBookb\x06proto3'
    )

    _globals = {}  # use a regular dict instead of the actual globals
    _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
    _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "addressbook_pb2", _globals)

    # normally this would simply be person = Person(),
    # but we intentionally don't modify globals here
    person = _globals["Person"]()
    person.name = "test"
    person.id = 1
    assert repr(person) == 'name: "test"\nid: 1\n'

    # the main reason to test copying and deepcopying is that we patch message.c
    assert repr(person) == repr(copy(person))
    assert repr(person) == repr(deepcopy(person))
